package com.example.demo.ordernumber;

import lombok.extern.slf4j.Slf4j;
import org.springframework.data.redis.core.RedisTemplate;
import org.springframework.stereotype.Component;

import javax.annotation.Resource;
import java.util.Objects;
import java.util.concurrent.TimeUnit;

/**
 * @author calwen
 * @since 2023/10/8
 */
@Slf4j
@Component
public class IdGenerator {

    @Resource
    RedisTemplate<String, Object> redisTemplate;

    /**
     * 生成订单号，组成形式为：201705081422301234，日期加 4 位随机数字字符串 <br>
     * <p>
     * 若spring上下文支持redis，则通过 redis nx 检查是否重复，确保分布式并发时 订单号唯一、
     *
     * @return
     */
    public String generatorOrderNo() {
        String orderNo = JUtils.generatorOrderNo();
        //支持redis，则检查 2秒内是否重复生成订单号，重复则重新生成
        if (redisTemplate != null) {
            Boolean success = redisTemplate.opsForValue().setIfAbsent("jcommon:orderno:" + orderNo, "", 2, TimeUnit.SECONDS);
            if (Objects.equals(success, false)) {
                return generatorOrderNo();
            }
        }
        return orderNo;
    }

}
